﻿Imports Castle.ActiveRecord
Imports NHibernate
Imports NHibernate.Criterion

Namespace Model

    <Serializable(), ActiveRecord("pessoa")> _
    Public Class PessoaPesquisa
        Inherits ActiveRecordBase(Of PessoaPesquisa)

        ''' Identificador interno do registro
        ''' Campo pessoa_cliente:
        ''' 0 = Não é
        ''' 1 = É do tipo
        ''' 2 = Excluido (sem vinculos)
        ''' 3 = Inativo
        Public Enum PessoaTipoStatus As Short
            Indefinido = 0
            Definido = 1
            Excluido = 2
            Inativo = 3
        End Enum

        Public Enum PessoaTipo As Short
            Cliente = 1
            Fornecedor = 2
            Representante = 3
            Empresa = 4
        End Enum

        Private _cd_pessoa As Integer
        Private _pessoa_nomecomercial As String
        Private _pessoa_razaosocial As String
        Private _pessoa_cpfcnpj As String
        Private _pessoa_insestadual As String
        Private _pessoa_cep As String
        Private _pessoa_endereco As String
        Private _pessoa_numero As Decimal
        Private _pessoa_complemento As String
        Private _pessoa_bairro As String
        Private _pessoa_cidade As String
        Private _pessoa_fone As String
        Private _pessoa_fax As String
        Private _pessoa_celular As String
        Private _pessoa_site As String
        Private _pessoa_email As String
        Private _pessoa_obs As String
        Private _pessoa_dadosbanc As String
        Private _pessoa_cliente As Short
        Private _pessoa_representante As Short
        Private _pessoa_fornecedor As Short
        Private _pessoa_armador As Short
        Private _pessoa_agente As Short
        Private _pessoa_transportadora As Short
        Private _pessoa_usuario As Short
        Private _pessoa_login As String
        Private _pessoa_password As String
        Private _pessoa_mercados As String

        <PrimaryKey(PrimaryKeyType.Sequence, SequenceName:="pessoa_cd_pessoa_seq")> _
        Public Property cd_pessoa() As Integer
            Get
                Return _cd_pessoa
            End Get
            Set(ByVal value As Integer)
                _cd_pessoa = value
            End Set
        End Property

        <[Property]("pessoa_nomecomercial")> _
        Public Property pessoa_nomecomercial() As String
            Get
                Return _pessoa_nomecomercial
            End Get
            Set(ByVal value As String)
                _pessoa_nomecomercial = value
            End Set
        End Property

        <[Property]("pessoa_razaosocial")> _
        Public Property pessoa_razaosocial() As String
            Get
                Return _pessoa_razaosocial
            End Get
            Set(ByVal value As String)
                _pessoa_razaosocial = value
            End Set
        End Property

        <[Property]("pessoa_cpfcnpj")> _
        Public Property pessoa_cpfcnpj() As String
            Get
                Return _pessoa_cpfcnpj
            End Get
            Set(ByVal value As String)
                _pessoa_cpfcnpj = value
            End Set
        End Property

        <[Property]("pessoa_insestadual")> _
        Public Property pessoa_insestadual() As String
            Get
                Return _pessoa_insestadual
            End Get
            Set(ByVal value As String)
                _pessoa_insestadual = value
            End Set
        End Property

        <[Property]("pessoa_cep")> _
        Public Property pessoa_cep() As String
            Get
                Return _pessoa_cep
            End Get
            Set(ByVal value As String)
                _pessoa_cep = value
            End Set
        End Property

        <[Property]("pessoa_endereco")> _
        Public Property pessoa_endereco() As String
            Get
                Return _pessoa_endereco
            End Get
            Set(ByVal value As String)
                _pessoa_endereco = value
            End Set
        End Property

        <[Property]("pessoa_numero")> _
        Public Property pessoa_numero() As Decimal
            Get
                Return _pessoa_numero
            End Get
            Set(ByVal value As Decimal)
                _pessoa_numero = value
            End Set
        End Property

        <[Property]("pessoa_complemento")> _
        Public Property pessoa_complemento() As String
            Get
                Return _pessoa_complemento
            End Get
            Set(ByVal value As String)
                _pessoa_complemento = value
            End Set
        End Property

        <[Property]("pessoa_bairro")> _
        Public Property pessoa_bairro() As String
            Get
                Return _pessoa_bairro
            End Get
            Set(ByVal value As String)
                _pessoa_bairro = value
            End Set
        End Property

        <[Property]("pessoa_cidade")> _
        Public Property pessoa_cidade() As String
            Get
                Return _pessoa_cidade
            End Get
            Set(ByVal value As String)
                _pessoa_cidade = value
            End Set
        End Property

        <[Property]("pessoa_fone")> _
        Public Property pessoa_fone() As String
            Get
                Return _pessoa_fone
            End Get
            Set(ByVal value As String)
                _pessoa_fone = value
            End Set
        End Property

        <[Property]("pessoa_fax")> _
        Public Property pessoa_fax() As String
            Get
                Return _pessoa_fax
            End Get
            Set(ByVal value As String)
                _pessoa_fax = value
            End Set
        End Property

        <[Property]("pessoa_celular")> _
        Public Property pessoa_celular() As String
            Get
                Return _pessoa_celular
            End Get
            Set(ByVal value As String)
                _pessoa_celular = value
            End Set
        End Property

        <[Property]("pessoa_site")> _
        Public Property pessoa_site() As String
            Get
                Return _pessoa_site
            End Get
            Set(ByVal value As String)
                _pessoa_site = value
            End Set
        End Property

        <[Property]("pessoa_email")> _
        Public Property pessoa_email() As String
            Get
                Return _pessoa_email
            End Get
            Set(ByVal value As String)
                _pessoa_email = value
            End Set
        End Property

        <[Property]("pessoa_obs")> _
        Public Property pessoa_obs() As String
            Get
                Return _pessoa_obs
            End Get
            Set(ByVal value As String)
                _pessoa_obs = value
            End Set
        End Property

        <[Property]("pessoa_dadosbanc")> _
        Public Property pessoa_dadosbanc() As String
            Get
                Return _pessoa_dadosbanc
            End Get
            Set(ByVal value As String)
                _pessoa_dadosbanc = value
            End Set
        End Property

        <[Property]("pessoa_cliente")> _
        Public Property pessoa_cliente() As Short
            Get
                Return _pessoa_cliente
            End Get
            Set(ByVal value As Short)
                _pessoa_cliente = value
            End Set
        End Property

        <[Property]("pessoa_representante")> _
        Public Property pessoa_representante() As Short
            Get
                Return _pessoa_representante
            End Get
            Set(ByVal value As Short)
                _pessoa_representante = value
            End Set
        End Property

        <[Property]("pessoa_fornecedor")> _
        Public Property pessoa_fornecedor() As Short
            Get
                Return _pessoa_fornecedor
            End Get
            Set(ByVal value As Short)
                _pessoa_fornecedor = value
            End Set
        End Property

        <[Property]("pessoa_armador")> _
        Public Property pessoa_armador() As Short
            Get
                Return _pessoa_armador
            End Get
            Set(ByVal value As Short)
                _pessoa_armador = value
            End Set
        End Property

        <[Property]("pessoa_agente")> _
        Public Property pessoa_agente() As Short
            Get
                Return _pessoa_agente
            End Get
            Set(ByVal value As Short)
                _pessoa_agente = value
            End Set
        End Property

        <[Property]("pessoa_transportadora")> _
        Public Property pessoa_transportadora() As Short
            Get
                Return _pessoa_transportadora
            End Get
            Set(ByVal value As Short)
                _pessoa_transportadora = value
            End Set
        End Property

        <[Property]("pessoa_usuario")> _
        Public Property pessoa_usuario() As Short
            Get
                Return _pessoa_usuario
            End Get
            Set(ByVal value As Short)
                _pessoa_usuario = value
            End Set
        End Property

        <[Property]("pessoa_login")> _
        Public Property pessoa_login() As String
            Get
                Return _pessoa_login
            End Get
            Set(ByVal value As String)
                _pessoa_login = value
            End Set
        End Property

        <[Property]("pessoa_password")> _
        Public Property pessoa_password() As String
            Get
                Return _pessoa_password
            End Get
            Set(ByVal value As String)
                _pessoa_password = value
            End Set
        End Property

        <[Property]("pessoa_mercados")> _
        Public Property pessoa_mercados() As String
            Get
                Return _pessoa_mercados
            End Get
            Set(ByVal value As String)
                _pessoa_mercados = value
            End Set
        End Property

        Private Function GetByTipoCriteria(ByVal tipo As PessoaTipo, ByVal q As DetachedCriteria) As IList(Of Model.PessoaPesquisa)
            Select Case tipo
                Case PessoaTipo.Cliente
                    q.Add(Restrictions.Or(Restrictions.Eq("pessoa_cliente", CType(PessoaTipoStatus.Definido, Short)), Restrictions.Eq("pessoa_cliente", CType(PessoaTipoStatus.Inativo, Short))))
                Case PessoaTipo.Fornecedor
                    q.Add(Restrictions.Or(Restrictions.Eq("pessoa_fornecedor", CType(PessoaTipoStatus.Definido, Short)), Restrictions.Eq("pessoa_fornecedor", CType(PessoaTipoStatus.Inativo, Short))))
                Case PessoaTipo.Representante
                    q.Add(Restrictions.Or(Restrictions.Eq("pessoa_representante", CType(PessoaTipoStatus.Definido, Short)), Restrictions.Eq("pessoa_representante", CType(PessoaTipoStatus.Inativo, Short))))
            End Select

            Return Model.PessoaPesquisa.FindAll(q)
        End Function


        Public Function GetByTipo(ByVal tipo As PessoaTipo) As IList(Of Model.PessoaPesquisa)
            Dim q As DetachedCriteria = DetachedCriteria.For(Of Model.PessoaPesquisa)("pessoa")

            'http://groups.google.com.br/group/nhusers/browse_thread/thread/4303332114b4f1d8/02739d8af59999e6?lnk=gst&q=sqlfunction+sum#02739d8af59999e6
            'Dim q As DetachedCriteria = DetachedCriteria.For(Of Model.Pessoa) _
            '    .SetProjection(Projections _
            '        .ProjectionList() _
            '        .Add(

            '' Join com pais e municipio
            'Dim q As DetachedCriteria = DetachedCriteria.For(Of Model.Pessoa) _
            '    .CreateAlias("Pais", "pais") _
            '    .CreateAlias("Municipio", "municipio")


            'Dim q As DetachedCriteria = DetachedCriteria.For(Of Model.Pessoa).CreateAlias(, "pessoa")
            'Select Case tipo
            '    Case PessoaTipo.Cliente
            '        q.Add(Restrictions.Or(Restrictions.Eq("pessoa_cliente", CType(PessoaTipoStatus.Definido, Short)), Restrictions.Eq("pessoa_cliente", CType(PessoaTipoStatus.Inativo, Short))))
            '    Case PessoaTipo.Fornecedor
            '        q.Add(Restrictions.Or(Restrictions.Eq("pessoa_fornecedor", CType(PessoaTipoStatus.Definido, Short)), Restrictions.Eq("pessoa_fornecedor", CType(PessoaTipoStatus.Inativo, Short))))
            '    Case PessoaTipo.Representante
            '        q.Add(Restrictions.Or(Restrictions.Eq("pessoa_representante", CType(PessoaTipoStatus.Definido, Short)), Restrictions.Eq("pessoa_representante", CType(PessoaTipoStatus.Inativo, Short))))
            'End Select

            'Return Model.Pessoa.FindAll(q)
            Return GetByTipoCriteria(tipo, q)
        End Function

        Public Function GetByNome(ByVal tipo As PessoaTipo, ByVal Nome As String) As IList(Of Model.PessoaPesquisa)

            Dim q As DetachedCriteria = DetachedCriteria.For(Of Model.PessoaPesquisa)("pessoa")

            q.Add( _
                Restrictions.Like("pessoa_nomecomercial", Nome, MatchMode.Anywhere).IgnoreCase() Or _
                Restrictions.Like("pessoa_razaosocial", Nome, MatchMode.Anywhere).IgnoreCase)

            Return GetByTipoCriteria(tipo, q)

        End Function

        Public Function GetByCPFCNPJ(ByVal tipo As PessoaTipo, ByVal CPFCNPJ As String) As IList(Of Model.PessoaPesquisa)
            Dim q As DetachedCriteria = DetachedCriteria.For(Of Model.PessoaPesquisa)("pessoa")

            q.Add(Restrictions.Like("pessoa_cpfcnpj", CPFCNPJ, MatchMode.Anywhere).IgnoreCase)

            Return GetByTipoCriteria(tipo, q)

        End Function



        Public Function GetByClienteStatus(Optional ByVal TipoStatus As PessoaTipoStatus = PessoaTipoStatus.Definido) As IList(Of Model.PessoaPesquisa)
            'Dim sess As se

            'Dim crit As NHibernate.ICriteria
            'crit.Add(NHibernate.Criterion.Restrictions.Eq("pessoa_cliente", CType(1, Int32)))

            'Dim NHibernateSession As ISession

            'NHibernateSession = NHibernateSessionManager.Instance.GetSession

            'Dim cr As NHibernate.Criterion.DetachedCriteria
            'cr.CreateCriteria("")
            'cr = NHibernate
            'cr.Add(NHibernate.Criterion.Restrictions.Eq("pessoa_cliente", CType(1, Int32)))

            'Dim q As NHibernate.Criterion.DetachedCriteria = NHibernate.Criterion.DetachedCriteria.For < Model.Pessoa > ("pessoa") _
            '.a

            ' Este funciona, mas está somente em uma linha, feito quebrado abaixo
            ' http://nhcb.codeplex.com/releases
            ' http://groups.google.com/group/nhibernate-br/browse_thread/thread/3768c0b932f17ee9/bb5787c82afb2888?lnk=gst&q=criteria+or#bb5787c82afb2888
            ' http://weblogs.asp.net/psteele/archive/2008/10/07/activerecord-and-a-custom-nhibernate-primitivetype.aspx
            'Dim query As DetachedCriteria = DetachedCriteria.[For](Of Model.Pessoa)("pessoa").Add(Expression.Eq("pessoa_cliente", CType(PessoaTipo.Definido, Short)))

            Dim q As DetachedCriteria = DetachedCriteria.For(Of Model.PessoaPesquisa)("pessoa") '.Add(Restrictions.Eq("pessoa_cliente", CType(PessoaTipo.Definido, Short)))
            q.Add(Restrictions.Or(Restrictions.Eq("pessoa_cliente", CType(PessoaTipoStatus.Definido, Short)), Restrictions.Eq("pessoa_cliente", CType(TipoStatus, Short))))

            ' Funciona também
            'Dim cri As NHibernate.Criterion.ICriterion
            'cri = Criterion.Restrictions.Eq("pessoa_cliente", CType(PessoaTipo.Definido, Short)) Or Criterion.Restrictions.Eq("pessoa_cliente", CType(Tipo, Short))

            Return Model.PessoaPesquisa.FindAll(q)
        End Function

    End Class
End Namespace